/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic;

import java.io.Serializable;

/**
 * Clase BDManage, encargada de la creación y manejo de bases de datos de objetos.
 * Crea un arreglo cuyo tamaño inicial es 0 y se incrementa conforme se agreguen
 * objetos. Su forma de uso es básicamente crear el objeto con el id que proporcione
 * el método firstFree, ya que ese id funcionará como index en la base de datos.
 * Al agregar un objeto se debe agregar en la posición que indique su index.
 * El método firstfree y addobject funcionan en conjunto para evitar colisiones de
 * index.
 * @author Victoria Fuenmayor y Jose Gabriel Rivera
 */
public class BDManage implements Serializable{
    private Objeto aBD[];
    
    /**
     * Constructor de BDManage. Crea la base de datos, instancia el arreglo de 
     * objetos aBD con un tamaño de 0.
     */
    public BDManage(){
        this.aBD = new Objeto[0];
    }
    
    /**
     * Agrega un nuevo objeto en el indice que coincide con su ID.
     * Si el arreglo no tiene espacio para agregar el nuevo objeto
     * crea un espacio nuevo e introduce el objeto alli.
     * 
     * Nota: Los IDs siempre se piden con la funcion firstFree, de forma que
     * no ocurran colisiones de index o que si no entra en el arreglo, siempre
     * el ID del objeto corresponda con el index de la nueva casilla creada
     * 
     * @param objeto Objeto a agregar
     * @param id Id del objeto
     */
    public void addObject(Objeto objeto, int id){
        if(id == this.aBD.length){
            Objeto aBD2[] = new Objeto[aBD.length+1];
            System.arraycopy(this.aBD, 0, aBD2, 0, this.aBD.length);
            this.aBD = aBD2;
        }
        this.aBD[id] = objeto;
    }
    
    /**
     * Borra el objeto que indique el ID que se le pasa.
     * @param id Id del objeto
     */
    public void removeObject(int id){
        this.aBD[id] = null;
    }
    
    /**
     * Busca y retorna el objeto que indique el ID que se le pasa
     * @param id Id del objeto
     * @return Objeto en la posicion id
     */
    public Objeto getObject(int id){
        return this.aBD[id];
    }
    
    /**
     * Retorna el tamaño del arreglo de objetos
     * @return El .lenght del arreglo
     */
    public int getLength(){
        return this.aBD.length;
    }
    
    /**
     * Retorna el primer espacio disponible que tenga el arreglo.
     * Si no hay ningún espacio disponible, retorna el tamaño del arreglo,
     * indicando que se debe crear un arreglo mas grande y ubicar el nuevo objeto
     * en esa posición.
     * 
     * Nota: El entero que retorna debe utilizarse como ID del objeto a crear,
     * ya que el ID del objeto se utiliza como index del mismo en el arreglo.
     * 
     * @return Entero que indica la primera posicion libre, o una posicion nueva en el arreglo.
     */
    public int firstFree(){
        for( int i=0; i < this.aBD.length ; i++){
            if ( this.aBD[i] == null ){
                return i;
            }
        }
        return this.aBD.length;
    }
    
    /**
     * Recibe una variable nombre de tipo String y busca en la base de datos el 
     * objeto cuyo nombre coincida con el que se envía por parámetros. La búsqueda
     * ignora los espacios vacíos del arreglo.
     * 
     * @param nombre Recibe el nombre del objeto a buscar.
     * 
     * @return Retorna el objeto si lo encuentra y null si no lo encuentra.
     */
    public Objeto buscarObjeto(String nombre){
        for(int i=0; i<aBD.length ; i++){
            if( aBD[i]!=null && nombre.equals(aBD[i].getNombre()) ){
                return aBD[i];
            }
        }
        return null;
    }
    

}